package cn.kgc.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;

/**
 * @author 课工场
 * @date 2024/6/3
 * @description
 */
public class TestMd5Authentication {

    public static void main(String[] args) {


        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        CustomerRealm realm = new CustomerRealm();
        // realm设置密码凭证匹配器
        HashedCredentialsMatcher md5 = new HashedCredentialsMatcher("MD5");
        // 设置散列的次数
        md5.setHashIterations(10);
        realm.setCredentialsMatcher(md5);

        securityManager.setRealm(realm);
        SecurityUtils.setSecurityManager(securityManager);
        
        Subject subject = SecurityUtils.getSubject();
        subject.login(new UsernamePasswordToken("admin","123456"));

        boolean authenticated = subject.isAuthenticated();
        System.out.println("authenticated = " + authenticated);


        /*
        *  用户通过认证之后，会将用户信息存储在session中
        *  1.shiro在做好相关配置之后其可以直接帮助实现非法请求拦截
        *  2.非法请求拦截的方式   filter实现    判定session中是否包含相关用户信息  ck  -> session
        *
        *  用户通过认证之后，可以开始进行后台接口的访问
        *   1.  公共资源      无需认证 就能访问的资源
        *   2.  受限资源
        *        2.1 认证通过
        *        2.2 判定是否有访问当前资源的权限  /user/delete   /user/add
        *
        *      实现方案：
        *         1.  在受限制资源对应的方法中判定用户是否有对应的权限    编程式权限控制
        *             权限：
        *                1. 角色权限     基于角色的权限判定           admin  super
        *                2. 权限字符串   基于显现字符串的权限判定
        *                   "sys:user:add"  "sys:user:update"  "sys:user:delete"  "sys:user:select"
        *         2.  通过注解实现        注解式权限控制
        *
        *      RBAC
        *          1.基于角色的权限控制
        *          2.基于资源的权限控制
        *          用户    角色    权限
        *      设计表     5张表
        *        用户表
        *        角色表
        *        用户角色关联表
        *        权限表
        *        角色权限关联表
        *      以上的权限控制方案，在shiro安全框架中均提供了对应的方法
        *
        * */

    }
}
